v4.2.12起支持
RFC-1014
提案使TaskWorker
内可以使用异步和协程API
。由于Task
设计之初未考虑支持异步和协程,因此带来了新的问题。
- 无法使用
return
返回值作为任务的结果 - 在异步或协程的程序中
Server::finish
可能会使用错误的任务上下文 - 在
onTask
回调函数中仍然需要使用go
手工创建协程,无法直接使用协程组件
增加task_enable_coroutine
,开启后自动在onTask
回调中创建协程,php
代码可以直接使用协程API
。
底层修改了onTask
回调的参数。新增Swoole\Server\Task
类,用于保存任务上下文,并返回结果。
未开启
task_enable_coroutine
时,仍然使用旧版本的4
参数回调
$server->on('Task', function ($serv, Swoole\Server\Task $task) {
//来自哪个`Worker`进程
$task->workerId;
//任务的编号
$task->id;
//任务的类型,taskwait, task, taskCo, taskWaitMulti 可能使用不同的 flags
$task->flags;
//任务的数据
$task->data;
//协程 API
co::sleep(0.2);
//完成任务,结束并返回数据
$task->finish([123, 'hello']);
});
task_enable_coroutine
必须在enable_coroutine == true
时才可以使用
$server->set([
'task_enable_coroutine' => true,
]);
由于task_async
配置存在严重的问题,在新的版本中将移除。这与旧版本会存在兼容性问题。请务必注意。
仅存在两种模式:
-
开启
task_enable_coroutine
,Task
工作进程支持协程 -
未开启
task_enable_coroutine
,仅支持同步阻塞